/* 
* 公共方法集(Base) 常用的一些与服务器交互和数据处理的方法
* @依赖：jQuery、Mcake、emhobject.js
* @最后更新时间: 2017-03-07 09:30:03
*/
;(function(win){
    //判断是否引入了依赖框架
    if(!window.jQuery || !window.Mcake){throw new Error("jQuery或Mcake未引入！");return;};
    //主程序对象
    var Base = {};

    //////////////////////////
    //------DOM相关操作-----//
    //////////////////////////
    M.extend(Base,{
        //获得table中一行tr的数据
        //第一个参数：传入要操作的tr 或者 tr中的按钮
        getTrData:function($tr){
            //返回结果 为JSON对象
            var ret = {};
            //如果传入的tr或者tr中的操作按钮没有传入 直接返回空数据
            if(M.isNull($tr)) return ret;
            //获得操作
            $tr = $($tr);
            //传入的有可能不是tr 是tr里面的按钮
            if($tr.get(0).tagName !== "TR") $tr = $tr.parents("tr");
            //获得tr里面所有带字段的TR 这里不会获取包含操作按钮的TD
            var $tds = $tr.find("td[data-value]");
            //循环当前行中的所有字段和数据
            $tds.each(function(i,td){
                var $td = $(td), //td
                    tdValue = $td.attr("data-value"),//td 字段
                    tdText = $td.attr("data-cont") || "";//td 文本
                //如果字段名不为空
                if(tdValue){
                    //放入JSON数组中
                    ret[tdValue] = tdText;
                }
            });
            return ret;
        },
        //创建一个下拉菜单的列表
        //第一个参数($select)：下拉选择框对象
        //第二个参数(listArr)：列表数据 格式为数组 必须包含 name value属性
        //第三个参数(isSearch)：是否增加一个空的选项
        //第三个参数(selected)：默认选中项 为数组 指定变量名 ["value1","value2"]
        createSelect:function($select,listArr,isSearch,selected){
            //如果下拉选择框和数据为传入 不进行操作
            if(!$select || !M.isArray(listArr)) return;
            //存放列表DOM的临时数组
            var listDom = [],
                //默认选中项
                selected = selected || [];
            //放入默认选项
            if(isSearch == true) listDom.push('<option value="">请选择</option>');
            //循环传入的数据
            M.each(listArr,function(list){
                var listName = list.name,//字典中文名
                    listValue = list.value || listName;//变量名
                //如果名字存在 创建一个下拉选项
                if(listName) listDom.push('<option value="'+listValue+'">'+listName+'</option>');
            });
            //获得下拉选择框
            $select = $($select);
            //放入列表选项DOM
            $select.html(listDom.join(""));
            //循环设置选中项
            M.each(selected,function(value){
                //找到默认选中项 并设置选中状态
                var $opt = $select.find("option[value='"+value+"']");
                $opt.prop("selected",true);
            });
        },
        /**
         * 创建表格中一行TR
         * 第一个参数($table)：表格对象或ID
         * 第二个参数(rowJson)：行数据
         * 第三个参数(btnHtml)：操作按钮HTML字符串
         */
        createTableRow:function($table,rowJson,btnHtml){
            //判断传入的参数是否正确
            if($table && M.isObject(rowJson) && M.isString(btnHtml)){
                //存放TD的HTML字符串
                var tdHtml = "";
                //循环整个头部所有字段 获取对应的内容
                $($table).find("th[data-value]").each(function (i,th){
                    //当前th
                    var $th = $(th),
                        //获得标题字段变量名并转成大写
                        thValue = $th.attr("data-value").toUpperCase(),
                        //获得显示宽度 如果为0则表示隐藏
                        thWidth = $th.attr("data-width"),
                        //是否隐藏的class
                        isHide = thWidth == "0" ? "hide" : "",
                        //获得字段对应的数据内容
                        tdCont = rowJson[thValue];
                    //判断内容是否找到 因为有可能返回的数据不是大写 而是小写字段
                    tdCont = tdCont ? tdCont : rowJson[thValue.toLowerCase()] || "";
                    //拼接所有的字段内容
                    tdHtml+='<td class="'+isHide+'" data-value="'+thValue+'" data-cont="'+tdCont+'">'+tdCont+'</td>';
                });
                //放入DOM
                $table.find('tbody').append('<tr>'+tdHtml+btnHtml+'</tr>');
            } 
        },
        /**
         * 编辑表格中一行数据
         * 第一个参数($eidtTr)：要操作的行对象或ID
         * 第二个参数(rowJson)：行数据
         */
        eidtTableRow:function($eidtTr,rowJson){
            //如果传入的参数不符合要求 不进行操作
            if(!$eidtTr || !M.isObject(rowJson)) return;
            //找到所有的字段TD 并遍历处理
            $($eidtTr).find("td[data-value]").each(function (i,td){
                //获得当前TD 和 字段名
                var $td = $(td),
                    //获得当前TD字段变量名 并转成大写
                    tdValue = $td.attr("data-value").toUpperCase(),
                    //获得当前字段内容
                    tdCont = $td.attr("data-cont") || "",
                    //获得字段对应的数据内容
                    tdNewCont = rowJson[tdValue];
                //判断内容是否找到 因为有可能返回的数据不是大写 而是小写字段
                tdNewCont = tdNewCont ? tdNewCont : rowJson[tdValue.toLowerCase()] || "";
                //console.log(tdCont+":"+tdNewCont)
                //如果新的数据不等于原来的数据 则进行修改
                if(tdCont != tdNewCont){
                    $td.attr("data-cont",tdNewCont);
                    $td.text(tdNewCont);
                }
            });
        }
        
    });

    //////////////////////////
    //------服务器交互------//
    //////////////////////////
    M.extend(Base,{
        //获得研究疾病列表 返回一个数组 格式为：[{name:"中文名",value:"疾病编码",id:"疾病编号"},{}..]
        getDiseaseList:function(){
            //获得研究疾病列表
            var ret = $.emhlocalobject.GetDiseaseList({},"1") || [];
            //处理得到的结果 并返回
            return M.map(ret,function(dis){
                //注释
                var disNote = dis.NOTE ? JSON.parse(dis.NOTE) : {},
                    //疾病代码
                    disId = disNote.id;
                return {
                    //疾病代码
                    id:disId,
                    //中文名
                    name:dis.NAME,
                    //疾病编码
                    value:dis.DCODE
                };
            });
        }
    });

    //暴露对象
    win.Base = Base;
})(window);
